﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using CrawlerCore;
using HtmlAgilityPack;
using WapCrawlerCore.Classes;
using WapCrawlerLib;

namespace WapCrawlerCore.WapCrawler
{
    public class GauPandaWapsite : WapSiteBase
    {
        public GauPandaWapsite(int wapCrawlerId) : base(wapCrawlerId)
        {
            
        }

        #region IWapSite Members

        public override void StartCrawler(int topicCrawlerId)
        {
            TopicCrawler objTopicCrawler = new TopicCrawler();
            objTopicCrawler = objTopicCrawler.Get(topicCrawlerId);
            objWapCrawler.recentCrawlerUrl = objTopicCrawler.topicUrl;
            //objWapCrawler.recentCrawlerUrl = "game-hay/game-online.html?page={1}&ref=hayday";
            //objWapCrawler.recentCrawlerUrl = "game-offline.html?page={1}&ref=hayday";
            //objWapCrawler.recentCrawlerUrl = "game-free.html?page={0}&ref=hayday";
            
            //Get items of first page
            if (objWapCrawler.recentCrawlerUrl != string.Empty)
            {
                string patternPage = @"page=(?<page>\d+)\&ref=hayday$";
                string pagingXPath = ".//div[@id='game']//div[@class='more']/a";
                GetPages(objWapCrawler.wapSiteUrl, objWapCrawler.recentCrawlerUrl, patternPage, pagingXPath);
            }
        }

        /// <summary>
        /// Lấy các game trong một trang
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <returns></returns>
        public override bool GetItemsOfPage(string pageUrl)
        {
            bool result = true;
            /*-------------------------------------
             * Load page với utf-8
             * ------------------------------------*/
            //Load page of the item 
            WebClient client = new WebClient();
            HtmlDocument doc = new HtmlDocument();
            //Endcoding is UTF8
            doc.Load(client.OpenRead(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, pageUrl)), Encoding.UTF8);

            //Lấy danh sách các bài viết của một page
            HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(".//div[@id='game']//div[@class='info']");
            if (nodeCollection != null)
            {
                //Xử lý từng bài viết một
                Parallel.ForEach(nodeCollection, (node, state) =>
                {
                    //Lấy url và title của bài viết
                    HtmlNode childNode = node.SelectNodes(".//h3/a")[0];
                    string postTitle = childNode.InnerText.Trim();
                    string postUrl = childNode.Attributes["href"].Value.Replace(objWapCrawler.wapSiteUrl, ""); ;
                    //Lấy thumbnail
                    childNode = node.SelectNodes(".//a/img")[0];
                    string thumbnailUrl = childNode.Attributes["src"].Value;
                    //Lấy head content
                    childNode = node.SelectNodes(".//span[@class='desc']")[0];
                    string postHead = childNode.InnerText;
                    //============================================================
                    //Lấy topic của game
                    string topicName = node.SelectNodes(".//a[@class='show-cat']")[0].InnerText.Trim();

                    
                    WapDataClassesDataContext dc = new WapDataClassesDataContext();
                    //========================================================
                    PostCrawler objPostCrawler = new PostCrawler();
                    try
                    {
                        objPostCrawler = dc.PostCrawlers.Single(p => p.postUrl == postUrl);
                        //If not allow update then return
                        if (objPostCrawler != null && !isAllowUpdate)
                        {
                            result = false;
                            state.Break();
                        }
                        else
                        {
                            //============================================================
                            //Cập nhật vào csdl
                            UpdateDB(postUrl, postTitle, thumbnailUrl, postHead, topicName);

                            //================================================================
                            //Lấy thông tin đầy đủ của một game và lưu vào csdl
                            GetItem(postUrl, topicName);
                        }
                    }
                    catch
                    {
                        //============================================================
                        //Cập nhật vào csdl
                        UpdateDB(postUrl, postTitle, thumbnailUrl, postHead, topicName);

                        //================================================================
                        //Lấy thông tin đầy đủ của một game và lưu vào csdl
                        GetItem(postUrl, topicName);
                    }
                });

            }
            return result;
        }

        /// <summary>
        /// Lấy đầy đủ nội dung của bài viết
        /// </summary>
        /// <param name="postUrl"></param>
        /// <param name="topicName"></param>
        public override void GetItem(string postUrl, string topicName)
        {
            WapDataClassesDataContext dc = new WapDataClassesDataContext();
            //========================================================
            //Đã xử lý thêm PostCrawler mới nếu chưa có ở hàm GetItemsOfPage
            PostCrawler objPostCrawler = new PostCrawler();
            objPostCrawler = dc.PostCrawlers.Single(p => p.postUrl == postUrl);

            /*-------------------------------------
             * Load page với utf-8
             * ------------------------------------*/
            //Load page of the item 
            WebClient client = new WebClient();
            HtmlDocument itemDoc = new HtmlAgilityPack.HtmlDocument();
            //Endcoding is UTF8
            itemDoc.Load(client.OpenRead(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, objPostCrawler.postUrl)), Encoding.UTF8);

            //Set false để chỉnh sửa lại nội dung, sau khi chỉnh xong set lại true
            objPostCrawler.crawlerStatus = false;

            string postContent = "";
            string linkDownload = "";

            //===================================================================
            //Xử lý phần nội dung (<div class="content-news">)
            //Nội dung xử lý gồm có: 
            // 1. Ảnh image-content
            // 2. Thể loại: gồm nhiều thể loại một lúc
            // 3. Ngôn ngữ
            // 4. Cốt truyện
            // 5. Screenshot
            //===================================================================
            bool isContent = false;
            HtmlNodeCollection nodeCollection = itemDoc.DocumentNode.SelectNodes(".//div[@class='content-news']");
            if (nodeCollection != null)
            {
                //Xử lý từng nội dung
                string content = "";
                foreach (HtmlNode node in nodeCollection.Nodes())
                {
                    //Kiểm tra node này có chứa file ảnh không
                    if (node.SelectNodes(".//div[@class='content-img']") != null)
                    {
                        HtmlNode nodeImg = node.SelectNodes(".//div[@class='content-img']//img")[0];
                        //Nếu chứa file ảnh kiểm tra file ảnh là file gif không
                        //Nếu là ảnh .gif "Hot" thì bỏ qua
                        if (nodeImg.Attributes["src"].Value.Contains(".gif"))
                            continue;
                        //string outerHTML = System.Web.HttpUtility.HtmlDecode(node.OuterHtml);
                        //if (outerHTML.Contains("Chơi thêm các Game Online miễn phí"))
                        //    continue;
                        
                        isContent = true;
                        
                        //Get content image
                        ImageCrawler img = new ImageCrawler();
                        if (!img.IsExist(objPostCrawler.postCrawlerId, nodeImg.Attributes["src"].Value))
                        {
                            img.imageName = objPostCrawler.postTitle;
                            img.imageUrl = nodeImg.Attributes["src"].Value;
                            objPostCrawler.ImageCrawlers.Add(img);
                        }
                        
                    }
                        
                    if (node.Name == "h2")
                        continue;
                    
                    if (isContent)
                    {
                        content = node.OuterHtml;
                        //Nếu node không phải là image link thì decode
                        if (node.SelectNodes(".//div[@class='content-img']") == null)
                        {
                            content = System.Web.HttpUtility.HtmlDecode(content);
                        }
                        postContent += content;
                    }
                }
            }

            //===================================================================
            //Xử lý lấy link download
            if (topicName == "Game Online")
                nodeCollection = itemDoc.DocumentNode.SelectNodes(".//div[./a[@class='Gdownload']]");
            else if (topicName == "Miễn Phí" 
                || topicName == "Game Offline")
                nodeCollection = itemDoc.DocumentNode.SelectNodes(".//div[@id='multi-link']");
            
            if (nodeCollection != null)
            {
                linkDownload = nodeCollection[0].OuterHtml;
            }

            //ghép toàn bộ nội dung lại
            postContent += linkDownload;
            //format content
            objPostCrawler.postContent = FormatContent(postContent);

            //Crawler a post complete!
            objPostCrawler.crawlerStatus = true;
            dc.SubmitChanges();
        }

        public override void Test(string pageUrl, string postTitle)
        {
            /*-------------------------------------
             * Load page với utf-8
             * ------------------------------------*/
            //Load page of the item 
            WebClient client = new WebClient();
            HtmlDocument doc = new HtmlDocument();
            //Endcoding is UTF8
            doc.Load(client.OpenRead(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, pageUrl)), Encoding.UTF8);
            
            //HtmlDocument doc = Browser.Get(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, pageUrl));

            HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(".//div[@id='game']//div[@class='info']");
            if (nodeCollection != null)
            {
                Parallel.ForEach(nodeCollection, (node,state) =>
                {
                    //info of a item
                    HtmlNode childNode = node.SelectNodes(".//h3/a")[0];
                    string title = childNode.InnerText.Trim();
                    if (title == postTitle)
                    {
                        //Lấy url của bài viết
                        //HtmlNode childNode = node.SelectNodes(".//h3/a")[0];
                        //string postTitle = childNode.InnerText.Trim();
                        string postUrl = childNode.Attributes["href"].Value.Replace(objWapCrawler.wapSiteUrl, ""); ;
                        //Lấy thumbnail
                        childNode = node.SelectNodes(".//a/img")[0];
                        string thumbnailUrl = childNode.Attributes["src"].Value;
                        //Lấy head content
                        childNode = node.SelectNodes(".//span[@class='desc']")[0];
                        string postHead = childNode.InnerText;
                        //============================================================
                        //Lấy topic của game
                        string topicName = node.SelectNodes(".//a[@class='show-cat']")[0].InnerText.Trim();

                        UpdateDB(postUrl, postTitle, thumbnailUrl, postHead, topicName);

                        //================================================================
                        //Lấy thông tin đầy đủ của một game và lưu vào csdl
                        GetItem(postUrl, topicName);
                        state.Break();
                    }
                });
            }
        }
        #endregion

       
    }
}
